﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;

namespace Lcsoft.Data.RDBMS.Results
{
	/// <summary>
	/// 表示输出参数的集合。
	/// </summary>
	[ComVisible(true)]
	public sealed class OutputParameterCollection
	{
		private readonly Dictionary<string, OutputParameter> _outputParameters;

		/// <summary>
		/// 初始化 <see cref="OutputParameterCollection"/> 的新实例。
		/// </summary>
		public OutputParameterCollection() { this._outputParameters = new Dictionary<string, OutputParameter>(); }

		/// <summary>
		/// 获取当前集合中包含的 <see cref="OutputParameter"/> 的数量。
		/// </summary>
		public int Count
		{
			get { return this._outputParameters.Count(); }
		}

		/// <summary>
		/// 获取一个值，该值表示当前集合是否为只读的。
		/// </summary>
		public bool IsReadOnly
		{
			get { return true; }
		}

		/// <summary>
		/// 向集合中添加一个 <see cref="OutputParameter"/>。
		/// </summary>
		/// <param name="key">指定键名。</param>
		/// <param name="value">要添加的 <see cref="OutputParameter"/> 的实例。</param>
		public void Add(string key, OutputParameter value) { this._outputParameters.Add(key, value); }

		/// <summary>
		/// 获取指定索引处的 <see cref="OutputParameter"/> 的实例。
		/// </summary>
		/// <param name="index">指定要获取的 <see cref="OutputParameter"/> 的从零开始的索引。</param>
		/// <returns>返回 <see cref="OutputParameter"/> 的实例。</returns>
		public OutputParameter GetValue(int index) { return this._outputParameters.ElementAtOrDefault(index).Value; }

		/// <summary>
		/// 获取具有指定名称的 <see cref="OutputParameter"/> 的实例。
		/// </summary>
		/// <param name="parameterName"><see cref="OutputParameter"/> 的名称。</param>
		/// <returns>返回 <see cref="OutputParameter"/> 的实例。</returns>
		public OutputParameter GetValue(string parameterName) { return this._outputParameters[parameterName]; }

		/// <summary>
		/// 设置具有指定名称的 <see cref="OutputParameter"/> 的项的值为 value。
		/// </summary>
		/// <param name="parameterName"><see cref="OutputParameter"/> 的名称。</param>
		/// <param name="value">一个 <see cref="System.Object"/>，它是该参数的值。默认值为 null。</param>
		internal void SetValue(string parameterName, object value) { if (this.ContainsKey(parameterName)) this._outputParameters[parameterName].Value = value; }

		/// <summary>
		/// 确定当前集合是否包含指定键。
		/// </summary>
		/// <param name="key">指定键名。</param>
		/// <returns>如果集合中已经存在指定的键名则返回 true，否则返回 false。</returns>
		public bool ContainsKey(string key) { return this._outputParameters.ContainsKey(key); }

		/// <summary>
		/// 返回循环访问当前集合的枚举数。
		/// </summary>
		/// <returns>返回循环访问当前集合的枚举数。</returns>
		public Dictionary<string, OutputParameter>.Enumerator GetEnumerator() { return this._outputParameters.GetEnumerator(); }

		/// <summary>
		/// 返回当前集合中的键的集合。
		/// </summary>
		/// <returns>返回当前集合中的键的集合。</returns>
		public Dictionary<string, OutputParameter>.KeyCollection GetKeys() { return this._outputParameters.Keys; }

		/// <summary>
		/// 返回当前集合中的值的集合。
		/// </summary>
		/// <returns>返回当前集合中的值的集合。</returns>
		public Dictionary<string, OutputParameter>.ValueCollection GetValues() { return this._outputParameters.Values; }

		/// <summary>
		/// 获取具有指定名称的 <see cref="OutputParameter"/> 的实例。
		/// </summary>
		/// <param name="key">指定要获取的 <see cref="OutputParameter"/> 的名称。</param>
		/// <param name="value">一个 <see cref="System.Object"/>，它是该参数的值。默认值为 null。</param>
		/// <returns>返回 <see cref="OutputParameter"/> 的实例。</returns>
		public bool TryGetValue(string key, out OutputParameter value) { return this._outputParameters.TryGetValue(key, out value); }
	}
}
